package _case

import (
	"fmt"
	"os"
)

func FmtCase() {
	// 打印到标准输出
	fmt.Println("今天天气很好")
	// 格式化，打印到标准输出
	fmt.Printf("%s天气很好\n", "今天")
	// 格式化
	str := fmt.Sprintf("%s天气很好\n", "今天，明天")
	// 输出到io.writer
	// 执行命令时可以分别重定向标准输出和标准错误
	//正常输出写入 stdout.log
	//错误信息写入 stderr.log
	//go run .\7-standard-lib\main.go > stdout.log 2> stderr.log
	n, err := fmt.Fprint(os.Stderr, str)
	fmt.Println(n, err)
}

type Simple struct {
	Value int
}

func FmtCase1() {
	s := Simple{1}
	// 通用占位符
	fmt.Printf("默认格式的值：%v\n", s)
	fmt.Printf("包含字段的值：%+v\n", s)
	fmt.Printf("go语法表示的值：%#v\n", s)
	fmt.Printf("go语法表示的类型：%T\n", s)
	fmt.Printf("输出字面上的百分号：%%1\n")
	fmt.Println()
	// 整数占位符
	n1 := 10
	n2 := 20170 //"今" 字码点值
	fmt.Printf("二进制：%b \n", n1)
	fmt.Printf("Unicode 码点转字符：%c \n", n2)
	fmt.Printf("十进制：%d \n", n1)
	fmt.Printf("八进制：%o \n", n1)
	fmt.Printf("0o前缀的八进制：%O \n", n1)
	fmt.Printf("用单引号将字符的值包起来：%q \n", n2)
	fmt.Printf("十六进制：%x \n", n1)
	fmt.Printf("十六进制大写：%X \n", n1)
	fmt.Printf("Unicode 格式：%U \n", n2)
	fmt.Println()
	// 宽度设置
	fmt.Printf("%v 的二进制：%b，go语法表示为：%#b，指定宽度为8，不足8为补0：%08b\n", n1, n1, n1, n1)
	fmt.Printf("%v 的十六进制：%x，go语法表示为：%#x，指定宽度为8，不足8为补0：%08x\n", n1, n1, n1, n1)
	fmt.Printf("%v 的字符为：%c，指定宽度为5，不足5为补0：%5c\n", n2, n2, n2)
	fmt.Println()
	// 浮点占位符
	f1 := 123.789
	f2 := 12345678910.7899
	fmt.Printf("指数为二的幂的无小数科学计数法：%b \n", f1)
	fmt.Printf("科学计数法：%e \n", f1)
	fmt.Printf("科学计数法，大写：%E \n", f1)
	fmt.Printf("有小数点的无指数，即常规的浮点数格式，默认宽度和精度：%f \n", f1)
	fmt.Printf("宽度为9，精度默认：%9f \n", f1)
	fmt.Printf("默认宽度，精度保留两位小数：%.2f \n", f1)
	fmt.Printf("宽度为9，精度保留两位小数：%09.2f \n", f1)
	fmt.Printf("宽度为9，精度保留0位小数：%09.f \n", f1)
	fmt.Printf("根据情况自动选%%e 或 %%f 来输出，以产生更紧凑的输出（末位无0）：%g %g \n", f1, f2)
	fmt.Printf("根据情况自动选%%E 或 %%F 来输出，以产生更紧凑的输出（末位无0）：%G %G \n", f1, f2)
	fmt.Printf("以十六进制的方式表示：%x \n", f1)
	fmt.Printf("以十六进制的方式表示，大写：%X \n", f1)
	fmt.Println()

	// 字符串占位符
	str := "今天天气很好"
	fmt.Printf("常规字符串：%s \n", str)
	fmt.Printf("单引号包括的字符串：%q \n", str)
	fmt.Printf("16进制字符串：%x \n", str)
	fmt.Printf("以空格作为两数之间的分隔符，大写16进制：% X \n", str)
	fmt.Println()

	// 指针占位符
	str1 := "今天是个好日子"
	bytes := []byte(str1)
	//切片第0个元素的地址
	fmt.Printf("%p \n", bytes)
	mp := make(map[string]int)
	fmt.Printf("%p \n", mp)
	var p *map[string]int = new(map[string]int)
	fmt.Printf("%p \n", p)
}
